home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / SDKs / Word Services SDK 1.0.6 / Writeswell Jr 1.2.1 Sources ƒ / Writeswell Jr. Source / Prefs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-11  |  13.2 KB  |  665 lines  |  [TEXT/MMCC]

  1. /* Prefs.c
  2.  * Preferences file management
  3.  * ©1992 Working Software, Inc.
  4.  * This source code is copyrighted.  Permission is granted to use the Word Services
  5.  * portion of the Writeswell Jr. source code in your own programs, but you 
  6.  * may not distribute the Writeswell Jr. word-processor code as a 
  7.  * commercial product.  If you modify the code, please do not call it 
  8.  * Writeswell Jr. (or Writeswell.)  This will ensure that people understand the 
  9.  * program and don’t have to deal with a number of different versions with 
  10.  * who-knows-what going on in the code.
  11.  * 
  12.  * Writeswell Jr. and Writeswell are trademarks of Working Software, Inc.
  13.  * 18 Apr 92 Mike Crawford
  14.  */
  15.  
  16. #include <EPPC.h>
  17. #include <AppleEvents.h>
  18. #include <AEObjects.h>
  19. #include <Folders.h>
  20. #include <Aliases.h>
  21. #include "AERegistry.h"
  22. #include "TBConstants.h"
  23. #include "TBGlobals.h"
  24. #include "Prefs.h"
  25. #include "MyGestalt.h"
  26. #include "MyFolders.h"
  27. #include "Gripe.h"
  28.  
  29. #define kAFServiceBaseID    2000
  30. #define kAFMenuIconBaseID    1257
  31.  
  32.  
  33. Boolean OpenPrefFile( void )
  34. {
  35.     short            oldDrive;
  36.     long            oldDir;
  37.     OSErr            err;
  38.     short            vRef;
  39.     long            dirID;
  40.     WDParam            wPB;
  41.     short            curFile;
  42.     Str255            prefsFileName;
  43.  
  44.     /* Find the preferences folder */
  45.     
  46.     if ( GetPrefFolder( &vRef, &dirID ) )
  47.         return false;
  48.     
  49.     /* Check if file exists */
  50.     
  51.     GetIndString( prefsFileName, kMiscStringID, kPreferencesFileNameStr );
  52.     
  53.     if ( prefsFileName[0] == '\0' )
  54.         return false;
  55.  
  56.     if ( !FileExistsWithThisType( vRef, dirID, prefsFileName, 'pref' ) ){
  57.     
  58.         /* if not, create it with default prefs */
  59.         if ( !CreateDefaultPrefFile( vRef, dirID, prefsFileName ) )
  60.             return false;
  61.     }    
  62.  
  63.     /* otherwise, open the file */
  64.     
  65.     wPB.ioCompletion = 0;
  66.     wPB.ioNamePtr = (StringPtr)NULL;
  67.     
  68.     err = PBHGetVol( (WDPBPtr) &wPB, false );
  69.     if ( err )
  70.         return false;
  71.     
  72.     oldDrive = wPB.ioWDVRefNum;
  73.     oldDir = wPB.ioWDDirID;
  74.  
  75.     wPB.ioVRefNum = vRef;
  76.     wPB.ioWDDirID = dirID;
  77.     wPB.ioNamePtr = (StringPtr)NULL;
  78.         
  79.     err = PBHSetVol( (WDPBPtr) &wPB, false );
  80.     if ( err )
  81.         return false;
  82.     
  83.     curFile = CurResFile();
  84.  
  85.     gPrefFileRefNum = OpenResFile( prefsFileName );
  86.     
  87.     err = ResError();
  88.  
  89.     UseResFile( curFile );            /* Restore old res file */
  90.  
  91.     wPB.ioVRefNum = oldDrive;
  92.     wPB.ioWDDirID = oldDir;
  93.  
  94.     err = PBHSetVol((WDPBPtr)  &wPB, false );            /* Restore original volume */
  95.  
  96.     if ( gPrefFileRefNum == -1 || err ){
  97.         return false;
  98.     }
  99.  
  100.     if ( ValidatePrefsFile() )
  101.         return false;
  102.  
  103.     return true;
  104. }
  105.  
  106. OSErr ValidatePrefsFile( void )
  107. {
  108.     short    curFile;
  109.     short    i;
  110.     OSErr    err;
  111.     Handle    h;
  112.  
  113.     curFile = CurResFile();
  114.     UseResFile( gPrefFileRefNum );
  115.  
  116.     /* Get defaults out of the application */
  117.     
  118.     if ( !( h = Get1Resource( 'PreF', kPFPrefsID )) ){
  119.         if ( err = CopyResource( kAFPrefsID, kPFPrefsID, 'PreF', gAppFileRefNum, gPrefFileRefNum  )){
  120.             UseResFile( curFile );
  121.             return err;
  122.         }
  123.  
  124. #ifdef __DEMO__
  125.  
  126.         /* Pre-install Spellswell in the menu
  127.          * 1.0.2 MDC I put this inside the if Get1Resource statement
  128.          */
  129.     
  130.         if ( System7Installed() ){
  131.             if ( err = AddSpellerItem() ){
  132.                 UseResFile( curFile );
  133.                 return err;
  134.             }
  135.         }    
  136. #endif
  137.  
  138.     }
  139.  
  140.     UpdateResFile( gPrefFileRefNum );
  141.     
  142.     UseResFile( curFile );    
  143.     
  144.     err = ResError();
  145.     
  146.     return err;
  147. }
  148.  
  149. #ifdef __DEMO__
  150.  
  151. OSErr AddSpellerItem( void )
  152. {
  153.     OSErr            err;
  154.     FSSpec            spellerSpec;
  155.     Boolean            foundSpeller;
  156.     Handle            h;
  157.     WWJrPrefsHdl    prefHdl;
  158.  
  159.     /* We want to show the menu already installed for the demo disks */
  160.  
  161.     if ( err = LookForSpeller( &spellerSpec, &foundSpeller ) )
  162.         return err;
  163.     
  164.     if ( !foundSpeller )
  165.         return noErr;        /* No error - speller was just not there */
  166.  
  167.     if ( !( h = Get1Resource( rAliasType, kServiceBaseID )) )
  168.         if ( err = CopyResource( kAFServiceBaseID, kServiceBaseID, rAliasType, gAppFileRefNum, gPrefFileRefNum  )){
  169.             return err;
  170.         }
  171.  
  172.     if ( err = PointAliasAtSpeller( kServiceBaseID, &spellerSpec ) ){
  173.         return err;
  174.     }
  175.  
  176.     if ( !( h = Get1Resource( 'STR ', kServiceBaseID )) )
  177.         if ( err = CopyResource( kAFServiceBaseID, kServiceBaseID, 'STR ', gAppFileRefNum, gPrefFileRefNum  )){
  178.             return err;
  179.         }
  180.  
  181.     if ( !( h = Get1Resource( 'SICN', kMenuIconBaseID )) )
  182.         if ( err = CopyResource( kAFMenuIconBaseID, kMenuIconBaseID, 'SICN', gAppFileRefNum, gPrefFileRefNum  )){
  183.             return err;
  184.         }
  185.  
  186.     prefHdl = GetPrefHandle();
  187.     if ( !prefHdl ){
  188.         Gripe( "\pCannot get preferences handle" );
  189.         return resNotFound;
  190.     }
  191.  
  192.     (*prefHdl)->serviceType[ 0 ] = kBatchService;
  193.     
  194.     ChangedResource( (Handle) prefHdl );
  195.     WriteResource( (Handle) prefHdl );
  196.     
  197.     return noErr;
  198. }
  199.  
  200. OSErr LookForSpeller( FSSpec *spellSpecPtr, Boolean *foundPtr )
  201. {
  202.     OSErr        err;
  203.     short        vRef;
  204.     long        dirID;
  205.     CInfoPBRec    cPB;
  206.     Str255        fileName;
  207.     short        dirIndex;
  208.  
  209.     *foundPtr = false;
  210.     
  211.     err = GetMyFolder( &vRef, &dirID );
  212.     if ( err )
  213.         return err;
  214.     
  215.     /* Now we search for the speller by creator code and type, by indexing through
  216.      * the folder's contents.
  217.      */
  218.     
  219.     dirIndex = 0;
  220.  
  221.     do {
  222.     
  223.         dirIndex++;
  224.  
  225.         cPB.hFileInfo.ioCompletion = (ProcPtr)NULL;
  226.         cPB.hFileInfo.ioNamePtr = fileName;
  227.         cPB.hFileInfo.ioVRefNum = vRef;
  228.         cPB.hFileInfo.ioFDirIndex = dirIndex;
  229.         cPB.hFileInfo.ioDirID = dirID;
  230.         
  231.         err = PBGetCatInfo( &cPB, false );
  232.         
  233.         if ( err && err != fnfErr )
  234.             return err;
  235.         
  236.         if ( cPB.dirInfo.ioFlAttrib & 0x10 )
  237.             continue;                            /* It's a directory */
  238.         
  239.         if ( cPB.hFileInfo.ioFlFndrInfo.fdType == 'APPL' ){
  240.             if ( cPB.hFileInfo.ioFlFndrInfo.fdCreator == 'SPWE' ){
  241.             
  242.                 /* We've got the speller.  Create the FSSpec for it */
  243.                 
  244.                 err = FSMakeFSSpec( vRef,
  245.                                     dirID,
  246.                                     fileName,
  247.                                     spellSpecPtr );
  248.                 
  249.                 if ( !err )
  250.                     *foundPtr = true;
  251.  
  252.                 return err;
  253.             }
  254.         }
  255.         
  256.         
  257.     } while ( err != fnfErr );
  258.     
  259.     /* If we get here, then the speller is simply not present */
  260.  
  261.     return noErr;
  262. }
  263.  
  264. OSErr GetMyFolder( short *vRefPtr, long *dirIDPtr )
  265. {
  266.     Handle        codeHdl;
  267.     short        appRefNum;
  268.     FCBPBRec    pb;
  269.     FSSpec        fSpec;
  270.     OSErr        err;
  271.     Str255        fileName;
  272.  
  273.     /* Find out our resource file refNum */
  274.     
  275.     codeHdl = GetResource( 'CODE', 0 );        /* Get a resource from our res file */
  276.     
  277.     if ( !codeHdl )
  278.         return resNotFound;
  279.     
  280.     appRefNum = HomeResFile( codeHdl );
  281.     
  282.     pb.ioCompletion = (ProcPtr)NULL;
  283.     pb.ioRefNum = appRefNum;
  284.     pb.ioVRefNum = 0;
  285.     pb.ioFCBIndx = 0;
  286.     pb.ioNamePtr = fileName;
  287.  
  288.     err = PBGetFCBInfo( &pb, false );
  289.     
  290.     if ( err ){
  291.         Gripe( "\pGetFCBInfo failed" );
  292.         return err;
  293.     }
  294.  
  295.     *vRefPtr = pb.ioVRefNum;
  296.     *dirIDPtr = pb.ioFCBParID;
  297.  
  298.     return noErr;
  299. }
  300.  
  301. OSErr PointAliasAtSpeller( short aliasID, const FSSpecPtr spellerSpecPtr )
  302. {
  303.     OSErr        err;
  304.     AliasHandle    oldAliasHdl;
  305.     Boolean        wasChanged;
  306.  
  307.     /* Get an existing alias from the preferences file, and "aim" it at
  308.      * Spellswell 7, which is given by the spellerSpecPtr.
  309.      * This allows the demo to be run off of locked demo disks and CD's, without
  310.      * having to set up the alias record ahead of time.
  311.      */
  312.     
  313.     oldAliasHdl = (AliasHandle)GetResource( rAliasType, aliasID );
  314.     if ( !oldAliasHdl )
  315.         return resNotFound;
  316.  
  317.     err = UpdateAlias( (FSSpecPtr)NULL, spellerSpecPtr, oldAliasHdl, &wasChanged );
  318.     if ( err ){
  319.         Gripe( "\pUpdateAlias failed" );
  320.         return err;
  321.     }
  322.     
  323.     (*oldAliasHdl)->userType = 'SPWE';            /* Put creator into alias record */
  324.     
  325.     ChangedResource( (Handle) oldAliasHdl );
  326.     WriteResource( (Handle) oldAliasHdl );
  327.     
  328.     return noErr;
  329. }
  330. #endif
  331.  
  332. OSErr GetPrefFolder( short *vRefPtr, long *dirIDPtr )
  333. {
  334.     OSErr    errCode;
  335.     long    blessedID;
  336.  
  337.     if ( FindFolderPresent() ){
  338.         errCode = FindFolder( kOnSystemDisk,
  339.                             kPreferencesFolderType,
  340.                             true,
  341.                             vRefPtr,
  342.                             dirIDPtr );
  343.         return errCode;
  344.     }
  345.     
  346.     /* System 6 style */
  347.  
  348.     /* First, get the refNum of the boot drive, and the ID of the system folder */
  349.     
  350.     errCode = GetSysVolID( vRefPtr, &blessedID );
  351.     if ( errCode ){
  352.         return errCode;
  353.     }
  354.     
  355.     /* Now get the ID of the "Preferences" folder in the system folder.
  356.      * if it does not exist, create it. */
  357.     
  358.     errCode = FindDirectory( *vRefPtr, blessedID, "\pPreferences", dirIDPtr );
  359.     if ( errCode == dirNFErr ){
  360.             errCode = MakeFolder( dirIDPtr, *vRefPtr, blessedID, "\pPreferences" );
  361.             if ( errCode )
  362.                 return errCode;
  363.     } else if ( errCode ){
  364.             return errCode;
  365.     }
  366.     
  367.     return noErr;
  368. }
  369.  
  370. Boolean FileExistsWithThisType( short vRef, long dirID, StringPtr fileName, OSType type )
  371. {
  372.     OSErr            err;
  373.     HParmBlkPtr        pbPtr;
  374.     Boolean            result;
  375.     
  376.     pbPtr = (HParmBlkPtr)NewPtr( sizeof( HParamBlockRec ) );
  377.  
  378.     if ( !pbPtr )
  379.         return false;
  380.         
  381.     pbPtr->fileParam.ioCompletion = (IOCompletionUPP)NULL;
  382.     pbPtr->fileParam.ioDirID = dirID;
  383.     pbPtr->fileParam.ioNamePtr = fileName;
  384.     pbPtr->fileParam.ioVRefNum = vRef;
  385.     pbPtr->fileParam.ioFDirIndex = 0;
  386.     
  387.     err = PBHGetFInfo( pbPtr, false );
  388.     
  389.     if ( err ){
  390.         result = false;
  391.     } else {
  392.     
  393.         if ( pbPtr->fileParam.ioFlFndrInfo.fdType != type )
  394.             result = false;
  395.         else
  396.             result = true;
  397.     }
  398.     
  399.     DisposPtr( (Ptr) pbPtr );
  400.     return result;
  401. }
  402.  
  403. Boolean CreateDefaultPrefFile( short vRef, long dirID, StringPtr fileName )
  404. {
  405.     OSErr            err;
  406.     HParmBlkPtr        pbPtr;
  407.     short            wdRef;
  408.     long            oldDir;
  409.     short            oldVol;
  410.  
  411.     /* We cannot count on the presence of HCreateResFile */
  412.  
  413.     
  414.     pbPtr = (HParmBlkPtr)NewPtr( sizeof( HParamBlockRec ) );
  415.     
  416.     if ( !pbPtr )
  417.         return false;
  418.     
  419.     pbPtr->wdParam.ioCompletion = (IOCompletionUPP)NULL;
  420.     pbPtr->wdParam.ioWDDirID = dirID;
  421.     pbPtr->wdParam.ioNamePtr = (StringPtr)NULL;
  422.     pbPtr->wdParam.ioVRefNum = vRef;
  423.     pbPtr->wdParam.ioWDProcID = 'ERIK';
  424.     
  425.     err = PBOpenWD( (WDPBPtr) pbPtr, false );
  426.  
  427.     if ( err ){
  428.         DisposPtr( (Ptr) pbPtr );
  429.         return false;
  430.     }
  431.     
  432.     wdRef = pbPtr->wdParam.ioVRefNum;
  433.     
  434.     pbPtr->wdParam.ioCompletion = (IOCompletionUPP)NULL;
  435.  
  436.     err = PBHGetVol( (WDPBPtr) pbPtr, false );
  437.     
  438.     if ( err ){
  439.         DisposPtr( (Ptr) pbPtr );
  440.         return false;
  441.     }
  442.     
  443.     oldDir = pbPtr->wdParam.ioWDDirID;
  444.     oldVol = pbPtr->wdParam.ioWDVRefNum;
  445.     
  446.     ((ParmBlkPtr)pbPtr)->fileParam.ioCompletion = (IOCompletionUPP)NULL;
  447.     ((ParmBlkPtr)pbPtr)->fileParam.ioNamePtr = (StringPtr)NULL;
  448.     ((ParmBlkPtr)pbPtr)->fileParam.ioVRefNum = wdRef;
  449.     
  450.     err = PBSetVol( (ParmBlkPtr) pbPtr, false );
  451.  
  452.     if ( err ){
  453.         DisposPtr( (Ptr) pbPtr );
  454.         return false;
  455.     }
  456.     
  457.     CreateResFile( fileName );
  458.     
  459.     err = ResError();
  460.     
  461.     if ( err ){
  462.         DisposPtr( (Ptr) pbPtr );
  463.         return false;
  464.     }
  465.  
  466.     pbPtr->fileParam.ioCompletion = (IOCompletionUPP)NULL;
  467.     pbPtr->fileParam.ioDirID = dirID;
  468.     pbPtr->fileParam.ioNamePtr = fileName;
  469.     pbPtr->fileParam.ioVRefNum = vRef;
  470.     pbPtr->fileParam.ioFDirIndex = 0;
  471.     
  472.     err = PBHGetFInfo( (HParmBlkPtr) pbPtr, false );
  473.     
  474.     if ( err ){
  475.         DisposPtr( (Ptr) pbPtr );
  476.         return false;
  477.     }
  478.  
  479.     pbPtr->fileParam.ioFlFndrInfo.fdType = 'pref';
  480.     pbPtr->fileParam.ioFlFndrInfo.fdCreator = 'MiKe';
  481.     pbPtr->fileParam.ioDirID = dirID;
  482.     pbPtr->fileParam.ioNamePtr = fileName;
  483.     pbPtr->fileParam.ioVRefNum = vRef;
  484.     pbPtr->fileParam.ioFDirIndex = 0;
  485.     
  486.     err = PBHSetFInfo( pbPtr, false );
  487.     
  488.     if ( err ){
  489.         DisposPtr( (Ptr) pbPtr );
  490.         return false;
  491.     }
  492.     
  493.     pbPtr->wdParam.ioCompletion = (IOCompletionUPP) NULL;
  494.     pbPtr->wdParam.ioWDDirID = oldDir;
  495.     pbPtr->wdParam.ioNamePtr = (StringPtr)NULL;
  496.     pbPtr->wdParam.ioVRefNum = oldVol;
  497.  
  498.     err = PBHSetVol( (WDPBPtr) pbPtr, false );
  499.  
  500.     if ( err ){
  501.         DisposPtr( (Ptr) pbPtr );
  502.         return false;
  503.     }
  504.  
  505.     pbPtr->wdParam.ioCompletion = (IOCompletionUPP)NULL;
  506.     pbPtr->wdParam.ioVRefNum = wdRef;
  507.     
  508.     err = PBCloseWD( (WDPBPtr) pbPtr, false );
  509.     
  510.     DisposPtr( (Ptr) pbPtr );
  511.     
  512.     if ( err )
  513.         return false;
  514.     
  515.     return true;
  516. }
  517.  
  518. OSErr CopyResource( short fromID,
  519.                     short toID,
  520.                     ResType theType,
  521.                     short fromFile,
  522.                     short toFile )
  523. {
  524.     short    curFile;
  525.     Handle    h;
  526.     Str255    name;
  527.     short    attr;
  528.     ResType    myType;
  529.     short    myID;
  530.     OSErr    err;
  531.     
  532.     /* This function will not work correctly if the ChangedResource
  533.      * or purge bits are set.
  534.      */
  535.     curFile = CurResFile();
  536.     UseResFile( fromFile );
  537.     
  538.     if ( err = ResError() ){
  539.         return err;
  540.     }
  541.     
  542.     h = GetResource( theType, fromID );
  543.     
  544.     UseResFile( curFile );
  545.     
  546.     if ( err || (err = ResError()) ){
  547.         return err;
  548.     }
  549.     
  550.     if ( !h || !*h ){
  551.         return resNotFound;
  552.     }
  553.     
  554.     GetResInfo( h, &myID, &myType, name );
  555.     if ( err = ResError() ){
  556.         return err;
  557.     }
  558.     attr = GetResAttrs( h );
  559.     if ( err = ResError() ){
  560.         return err;
  561.     }
  562.     
  563.     DetachResource( h );
  564.     if ( err = ResError() ){
  565.         return err;
  566.     }
  567.     
  568.     curFile = CurResFile();
  569.     UseResFile( toFile );
  570.  
  571.     AddResource( h, theType, toID, name );
  572.     if ( err = ResError() ){
  573.         UseResFile( curFile );
  574.         return err;
  575.     }
  576.  
  577.     WriteResource( h );
  578.     if ( err = ResError() ){
  579.         UseResFile( curFile );
  580.         return err;
  581.     }
  582.     
  583.     UseResFile( curFile );
  584.  
  585.     if ( err = ResError() ){
  586.         return err;
  587.     }
  588.     
  589.     SetResAttrs( h, attr );
  590.     if ( err = ResError() ){
  591.         return err;
  592.     }
  593.     
  594.  
  595.     return noErr;
  596. }
  597.  
  598. #ifdef NEVER                        /* This will return in a future version */
  599. void ToggleSelectCheck( void )
  600. {
  601.     WWJrPrefsHdl    prefHdl;
  602.     
  603.     prefHdl = GetPrefHandle();
  604.     if ( !prefHdl ){
  605.         Gripe( "\pCannot get preferences handle" );
  606.         return;
  607.     }
  608.  
  609.     if ( (*prefHdl)->checkSel ){
  610.         (*prefHdl)->checkSel = 0;
  611.     }else{
  612.         (*prefHdl)->checkSel = 1;
  613.     }
  614.  
  615.     ChangedResource( prefHdl );
  616.     WriteResource( prefHdl );
  617.  
  618.     CheckSelectMenu( prefHdl );
  619.  
  620.     return;
  621. }
  622.  
  623. void CheckSelectMenu( WWJrPrefsHdl prefHdl )
  624. {
  625.     MenuHandle    servMenu;
  626.  
  627.     servMenu = GetServiceMenu();
  628.     if ( !servMenu ){
  629.         Gripe( "\pCannot get service menu handle" );
  630.         return;
  631.     }
  632.  
  633.     if ( (*prefHdl)->checkSel ){
  634.         CheckItem( servMenu, kSMCheckSel, true );
  635.     }else{
  636.         CheckItem( servMenu, kSMCheckSel, false );
  637.     }
  638.  
  639.     return;
  640. }
  641. #endif
  642.  
  643. MenuHandle GetServiceMenu( void )
  644. {
  645.     MenuHandle servMenu;
  646.     
  647.     servMenu = (MenuHandle)GetResource( 'MENU', kServMenuID );
  648.     
  649.     return servMenu;
  650. }
  651.  
  652. WWJrPrefsHdl GetPrefHandle( void )
  653. {
  654.     WWJrPrefsHdl    prefHdl;
  655.     short            curFile;
  656.     
  657.     curFile = CurResFile();
  658.     UseResFile( gPrefFileRefNum );
  659.     
  660.     prefHdl = (WWJrPrefsHdl)GetResource( 'PreF', kPFPrefsID );
  661.     
  662.     UseResFile( curFile );
  663.  
  664.     return prefHdl;                    /* Might be Nil; up to caller to check */
  665. }